
#ifndef FISICA_TRIANGULO_MALLA_H_
#define FISICA_TRIANGULO_MALLA_H_

#include <vector>

class btTriangleIndexVertexArray;
class btCollisionShape;

namespace Fisica {

class TrianguloMalla {
   private:
      std::vector<std::vector<float>* > coords;
      std::vector<std::vector<int>* > indices;

      btTriangleIndexVertexArray *triangulos;

      void crearIndiceStrip(int *index, const int cantIndices, const int cantVertices);
      void crearIndiceFan(int *index, const int cantIndices, const int cantVertices);

      btCollisionShape *malla;
      bool huboCambio;

   public:

      enum Modo {
         TriangleStrip,
         TriangleFan
      };

      TrianguloMalla();

      /*
       * "Posicion" es una posicion dentro del vector en la que contiene
       * la coordenada x del primer vertice.
       * En las siguientes dos posiciones, se deben encontrar las coordenadas y z
       * faltantes.
       *
       * Las siguientes coordenadas x y z del siguiente vertice comienzan en la
       * posicion "posicion"+"paso".
       *
       * Asi, el vertice i, se encuentra en la posicion "pos" + "paso" * i
       *
       * El proceso se repite hasta haber copiado "cantVertices" vertices
       *
       * El modo especifica como seran interpretados los vertices.
       * Dada la secuencia de vertices v0, v1, v2, v3, ..., vn-1, vn
       *       en modo Strip los triangulos son:
       *
       *          (v0, v1, v2), (v1, v2, v3), (v2, v3, v4) ... (vn-2, vn-1, vn)
       *
       *       en modo Fan:
       *
       *          (v0, v1, v2), (v0, v2, v3), (v0, v3, v4) ... (v0, vn-1, vn)
       * */
      void agregar(const std::vector<float> &vertices, unsigned posicion, 
            unsigned paso, unsigned cantVertices, Modo modo);

      /*
       * Crea un objeto dinamico y lo pasa como valor de retorno.
       * La instancia de TrianguloMalla NO se hara responsable de los recursos
       * adquiridos, delegando la tarea de liberacion de recursos al objeto que
       * invoco este metodo.
       *
       * El objeto retornado sera mantenido por esta instancia y sera valida mientras
       * no se modifique esta instancia.
       *
       * Es un error intentar crear una forma si no se agrego ninguna secuencia de
       * triangulos "nunca".
       *
       * Multiples creacion de la forma SON validas aunque no se agreguen NUEVAS
       * secuencias de triangulos. En particular, dichas llamadas retornan la MISMA
       * forma.
       *
       * */
      btCollisionShape& makeForma();

      ~TrianguloMalla();
};
}
#endif
